<!DOCTYPE html>
<html lang='zh-CN'>

<head>
  <meta name="generator" content="Hexo 5.4.0">
  <meta charset="utf-8">
  

  <meta http-equiv='x-dns-prefetch-control' content='on' />
  <link rel='dns-prefetch' href='https://cdn.jsdelivr.net'>
  <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
  <link href="https://cdn.bootcdn.net/ajax/libs/KaTeX/0.13.0/katex.min.css" rel="stylesheet">
	<script src="https://cdn.bootcdn.net/ajax/libs/KaTeX/0.13.0/katex.min.js"></script>
	<script>
    
		var katex_config = {
	  delimiters: 
	  [
		  {left: "$$", right: "$$", display: true},
  		{left: "$", right: "$", display: false}
	  ]
    };
    


	</script>
	<script defer src="https://cdn.bootcdn.net/ajax/libs/KaTeX/0.13.0/contrib/auto-render.min.js" onload="renderMathInElement(document.body,katex_config)"></script>

  <meta name="renderer" content="webkit">
  <meta name="force-rendering" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
  <meta name="HandheldFriendly" content="True" >
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  <title>如何在手机上设置南大 APP 自动打卡（一） - Debug Myself</title>

  

  
    <meta name="description" content="Github 上 @cubiccm大佬的打卡程序只实现了打卡的部分，登录部分还需要手动操作，并不能实现真正的自动化。所以我用 Python 实现了登陆部分，同时简化了一下 cubiccm 的代码，得到了一个完整的打卡程序。  电脑上运行 Python 程序文件可以从  我的 Gitee 仓库  获取。 将 daka.py 文件下载到本地后，把文件中的 username，password，locat">
<meta property="og:type" content="article">
<meta property="og:title" content="如何在手机上设置南大 APP 自动打卡（一）">
<meta property="og:url" content="https://stassenger.gitee.io/2021/08/08/how-to-automatically-report-nju-health-information-on-the-phone/index.html">
<meta property="og:site_name" content="Debug Myself">
<meta property="og:description" content="Github 上 @cubiccm大佬的打卡程序只实现了打卡的部分，登录部分还需要手动操作，并不能实现真正的自动化。所以我用 Python 实现了登陆部分，同时简化了一下 cubiccm 的代码，得到了一个完整的打卡程序。  电脑上运行 Python 程序文件可以从  我的 Gitee 仓库  获取。 将 daka.py 文件下载到本地后，把文件中的 username，password，locat">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://stassenger.gitee.io/2021/08/08/how-to-automatically-report-nju-health-information-on-the-phone/image.png">
<meta property="article:published_time" content="2021-08-07T16:00:00.000Z">
<meta property="article:modified_time" content="2021-08-14T02:22:47.416Z">
<meta property="article:author" content="Asante Stassenger">
<meta property="article:tag" content="Python">
<meta property="article:tag" content="NJU">
<meta property="article:tag" content="Termux">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://stassenger.gitee.io/2021/08/08/how-to-automatically-report-nju-health-information-on-the-phone/image.png">
  
  

  <!-- feed -->
  

  
    
<link rel="stylesheet" href="/css/main.css">

  

  
<!-- hexo injector head_end start -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css">

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/hexo-math@4.0.0/dist/style.css">
<!-- hexo injector head_end end --></head>

<body>
  


  <div class='l_body' id='start'>
    <aside class='l_left'>
    

<header class='header'>
  <div class='logo-wrap'>
  
  
    <a class='title' href='/'>
      Debug Myself
    </a>
  
</div>

  <nav class="menu dis-select"><a class="nav-item active" href="/">文章</a><a class="nav-item" href="/2021/08/09/about/">关于</a></nav>
</header>

<div class='widgets'>
  
    
      
      
<div class="widget-wrap" id="toc"><div class="widget-header h4 dis-select"><span class="name">本文目录</span></div><div class="widget-body fs14 post"><div class="doc-tree active"><ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%94%B5%E8%84%91%E4%B8%8A%E8%BF%90%E8%A1%8C"><span class="toc-text"> 电脑上运行</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%89%8B%E6%9C%BA%E5%AE%9E%E7%8E%B0"><span class="toc-text"> 手机实现</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%AE%89%E8%A3%85%20termux"><span class="toc-text"> 安装 Termux</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%90%AD%E5%BB%BA%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83"><span class="toc-text"> 搭建开发环境</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BF%90%E8%A1%8C%20python%20%E8%84%9A%E6%9C%AC"><span class="toc-text"> 运行 Python 脚本</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%AE%BE%E7%BD%AE%E5%AE%9A%E6%97%B6%E6%89%A7%E8%A1%8C"><span class="toc-text"> 设置定时执行</span></a></li></ol></li></ol></div></div></div>

    
  
</div>


    </aside>
    <div class='l_main'>
      

      


  <div class='bread-nav fs12'>
  
    
    <div id='breadcrumb'>
      <a class='cap breadcrumb' href='/'>主页</a>
      <span class="sep"></span>
      <a class='cap breadcrumb' href='/'>文章</a>
      
    </div>
    <div id='post-meta'>
      发布于&nbsp;<time datetime='2021-08-07T16:00:00.000Z'>2021-08-08</time>
    </div>
  
  </div>


<article class='content md post'>
<h1 class="article-title"><span>如何在手机上设置南大 APP 自动打卡（一）</span></h1>
<p>Github 上 @<a target="_blank" rel="noopener" href="https://github.com/cubiccm/nju-auto-report">cubiccm</a>大佬的打卡程序只实现了打卡的部分，登录部分还需要手动操作，并不能实现真正的自动化。所以我用 Python 实现了登陆部分，同时简化了一下 cubiccm 的代码，得到了一个完整的打卡程序。</p>
<h2 id="电脑上运行"><a class="markdownIt-Anchor" href="# 电脑上运行"></a> 电脑上运行</h2>
<p>Python 程序文件可以从 <a target="_blank" rel="noopener" href="https://gitee.com/stassenger/njuhealth-report"> 我的 Gitee 仓库 </a> 获取。</p>
<p>将 <code>daka.py</code> 文件下载到本地后，把文件中的 <code>username</code>，<code>password</code>，<code>location</code> 改成自己的信息，使用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install requests lxml beautifulsoup4 pyexecjs</span><br></pre></td></tr></table></figure>
<p>安装用到的包，使用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python 文件所在路径 /daka.py</span><br></pre></td></tr></table></figure>
<p>执行文件，出现：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">时间 + Report username <span class="string">&#x27;s health information successfully!</span></span><br></pre></td></tr></table></figure>
<p>表示打卡成功。可以利用 Windows 的计划任务来实现每天自动打卡。</p>
<p>到此，我们已经实现了自动打卡。</p>
<p>那么，如何用手机来自动打卡呢？我首先想到的是利用安卓上的自动化工具 Tasker，并且成功实现了打卡的部分，但是登陆的部分并没有找到合适的实现方法，这部分需要熟练使用 Tasker 的人来做了。然后我想到了 Termux，一个安卓上的 Linux 模拟器，用模拟器来运行 Python 程序实现自动打卡。</p>
<p>！！注意！！：以下方法有着复杂的流程和较高的代价，性价比较低，不如设置闹钟提醒打卡方便，只适合喜欢折腾或者有意愿在手机上运行 Python 代码的使用者。并且，由于需要 Python 与 Node.js 环境，所需空间大约为 800MB。不过，打卡程序实际上进行的是网络请求操作，如果只用 Node.js 来实现可能会节省 300MB-400MB 的空间，如果只用 Tasker 来实现，可能会节省 800MB 左右空间，并且 Tasker 有着更低的性能使用、更低的耗电量与更稳定的性能，但受限于我现在的技术水平，还不能用 Tasker 实现。</p>
<h2 id="手机实现"><a class="markdownIt-Anchor" href="# 手机实现"></a> 手机实现</h2>
<h3 id="安装 termux"><a class="markdownIt-Anchor" href="# 安装 termux"></a> 安装 Termux</h3>
<p>首先在手机上安装 Termux。Termux 在谷歌应用商店里已经停止更新，我使用的是 F-Droid 上的最新版，大概 80MB。不过使用旧的版本也是可以的，使用体验并没有很大差别，旧的版本可以在酷安上搜索找到，体积很小，不过我建议使用 F-Droid 的版本。</p>
<p>进入软件后，我们就看到了命令行的界面，如果出现错误可能是国内的网络问题。</p>
<p>在这里可以通过输入命令来进行操作。为了保证之后的定时执行顺利，在通知栏找到</p>
<div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="" data-src="image.png"/><a class="image-download blur" style="opacity:0" href="image.png"><svg class="icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3734"><path d="M561.00682908 685.55838913a111.03077546 111.03077546 0 0 1-106.8895062 0L256.23182837 487.72885783a55.96309219 55.96309219 0 0 1 79.13181253-79.18777574L450.70357448 523.88101491V181.55477937a55.96309219 55.96309219 0 0 1 111.92618438 0v344.06109173l117.07478902-117.07478901a55.96309219 55.96309219 0 0 1 79.13181252 79.18777574zM282.81429711 797.1487951h447.70473912a55.96309219 55.96309219 0 0 1 0 111.92618438H282.81429711a55.96309219 55.96309219 0 0 1 0-111.92618438z" p-id="3735"></path></svg></a></div></div>
<p>获取 wake lock，点击允许，同时打开手机后台锁定应用，并在手机的设置里将 Termux 加入各种电池优化的白名单，具体设置方法不同品牌略有差异。这些都是为了尽量保证 Termux 可以常驻后台，但会增加耗电。不过具体的耗电程度和保持后台运行的可靠性均没有经过测试。</p>
<h3 id="搭建开发环境"><a class="markdownIt-Anchor" href="# 搭建开发环境"></a> 搭建开发环境</h3>
<p>接下来进入正式的环境搭建环节。我在测试时进行的操作都是通过 ssh 在电脑上完成的，但考虑到 ssh 除了打字方便以外不是很必要，以下的操作都是在手机上用手机键盘打字就可以完成的。</p>
<p>首先是更换国内镜像源，提高之后的软件安装速度。</p>
<p>在命令行输入：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">termux-change-repo</span><br></pre></td></tr></table></figure>
<p>后回车，出现一个图形界面。点击 ok 按钮，在新的界面选择 Tsinghua University（清华大学），然后点击 ok 按钮。如果没有红色文字或者 Warning 等字样，一般表示换源成功。</p>
<p>之后在命令行分次输入以下内容并回车：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">apt-get update</span><br><span class="line">apt-get install nano python git cronie libxml2 libxslt nodejs </span><br></pre></td></tr></table></figure>
<p>提示输入 <code>y/n</code>，输入<code>y</code> 回车。</p>
<p>然后安装 Python 用到的的包，这里不进行换源操作，原因是安装的包体积都很小，国外服务器速度足够：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install requests bs4 pyexecjs wheel lxml</span><br></pre></td></tr></table></figure>
<p>这里的 wheel 不是必须的，可以删掉。如果输出内容出现 Warning 提示升级 pip，不影响后续操作。</p>
<h3 id="运行 python 脚本"><a class="markdownIt-Anchor" href="# 运行 python 脚本"></a> 运行 Python 脚本</h3>
<p>接下来从我的 Gitee 仓库下载文件，运行：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://gitee.com/stassenger/njuhealth-report</span><br></pre></td></tr></table></figure>
<p>下载文件，使用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls</span><br></pre></td></tr></table></figure>
<p>查看当前目录，可以看到一个名为 njuhealth-report 的文件夹，说明下载成功。</p>
<p>使用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> njuhealth-report/</span><br></pre></td></tr></table></figure>
<p>进入文件夹，使用 <code>ls</code> 可以看到三个文件。</p>
<p>使用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nano daka.py</span><br></pre></td></tr></table></figure>
<p>打开文件进行编辑。注意这里的光标不能使用触摸，需要使用键盘自带的箭头进行操作。修改 <code>username</code>，<code>password</code> 和<code>location</code>的值，使用 Ctrl+s 保存，使用 Ctrl+x 退出。</p>
<p>运行:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python daka.py</span><br></pre></td></tr></table></figure>
<p>查看是否出现成功字样。</p>
<h3 id="设置定时执行"><a class="markdownIt-Anchor" href="# 设置定时执行"></a> 设置定时执行</h3>
<p>首先使用:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">touch daka.log</span><br></pre></td></tr></table></figure>
<p>创建日志文件，用来保存打卡记录。之后执行：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crond</span><br></pre></td></tr></table></figure>
<p>开启定时任务，然后使用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crontab -e</span><br></pre></td></tr></table></figure>
<p>添加定时任务指令</p>
<p>输入:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">30 6 * * * python ~/njuhealth-report/daka.py &gt;&gt; ~/njuhealth-report/daka.log</span><br></pre></td></tr></table></figure>
<p>使用 Ctrl+s 保存，Ctrl+x 退出。这里表示每天的早晨 6:30 使用 python 执行 daka.py 并把结果保存在 daka.log 中。</p>
<p>到此，手机上的自动打卡配置完成。在查找资料时，发现可以使用 Tasker 配合 Termux 的插件来完成定时任务，但在我这里插件无法正常运行。Termux 是个十分强大的安卓 Linux 终端模拟器，甚至可以安装完整的 Linux 发行版，具体可以参考 @<a target="_blank" rel="noopener" href="https://www.sqlsec.com/2018/05/termux.html">国光 </a> 的博客或者网上搜索更多资料。</p>
<p>部分参考：</p>
<p><a target="_blank" rel="noopener" href="https://www.jianshu.com/p/43676346b0be">win10 定时任务自动运行 python 程序</a></p>
<p><a target="_blank" rel="noopener" href="https://www.sqlsec.com/2018/05/termux.html">国光：Termux 高级终端安装使用配置教程</a></p>
<p><a target="_blank" rel="noopener" href="https://mirrors.tuna.tsinghua.edu.cn/help/termux/">Termux 镜像使用帮助</a></p>
<p><a target="_blank" rel="noopener" href="https://www.cnblogs.com/SunSAS/p/12202735.html">linux 下安装 lxml 包</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/Eternally831143/article/details/112759523">Termux 定时运行 python 脚本</a></p>
<p><a target="_blank" rel="noopener" href="https://www.jianshu.com/p/e01a3d504700">Python 爬虫杂记 - python 运行 js</a></p>
<p><a target="_blank" rel="noopener" href="https://www.jianshu.com/p/c239a7eaadba">安卓 termux 折腾手记：安装 python 库 +tasker 调用</a></p>
<p><a target="_blank" rel="noopener" href="https://nicelee.top/blog/2019/09/08/android-linux-4/">旧手机废物利用(4)-Termux：Tasker 定时调用任务</a></p>
<p><a target="_blank" rel="noopener" href="https://www.jianshu.com/p/c8a2bf0312f5">使用 ssh 链接 Termux</a></p>


<div class="article-footer fs14"><section id="license"><div class="header"><span>许可协议</span></div><div class="body"><p>本文采用 <a target="_blank" rel="noopener" href="https://creativecommons.org/licenses/by-nc-sa/4.0/">署名-非商业性使用-相同方式共享 4.0 国际</a> 许可协议，转载请注明出处。</p>
</div></section><section id="share"><div class="header"><span>分享文章</span></div><div class="body"><div class="link"><input class="copy-area" readonly="true" id="copy-link" value="https://stassenger.gitee.io/2021/08/08/how-to-automatically-report-nju-health-information-on-the-phone/" /></div><div class="social-wrap dis-select"><a class="social share-item wechat" onclick="util.toggle(&quot;qrcode-wechat&quot)"><img class="lazy" src="" data-src="https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/social/b32ef3da1162a.svg"/></a><a class="social share-item email" href="mailto:?subject=如何在手机上设置南大 APP 自动打卡（一） - Debug Myself&amp;body=https://stassenger.gitee.io/2021/08/08/how-to-automatically-report-nju-health-information-on-the-phone/"><img class="lazy" src="" data-src="https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/social/a1b00e20f425d.svg"/></a><a class="social share-item link" onclick="util.copy(&quot;copy-link&quot;, &quot;复制成功&quot;)"><img class="lazy" src="" data-src="https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/social/8411ed322ced6.svg"/></a></div><div class="qrcode" id="qrcode-wechat" style="visibility:hidden;height:0"><img class="lazy" src="" data-src="https://api.qrserver.com/v1/create-qr-code/?size=256x256&data=https://stassenger.gitee.io/2021/08/08/how-to-automatically-report-nju-health-information-on-the-phone/index.html"/></div></div></section></div>

</article>

<div class="related-wrap" id="read-next"><section class="header cap theme"><span>接下来阅读</span></section><section class="body"><div class="post-title h2"><a href="/2021/07/12/sort-algorithm-reminder-3/">排序算法备忘录（三）</a></div><div class="post-title fs14"><a href="/2021/08/09/about/">上一篇：关于</a></div></section></div>






  <div class='related-wrap md' id="comments">
    <div class='cmt-title cap theme'>
      快来参与讨论吧
    </div>
    <div class='cmt-body valine'>
      

<div id="valine_container" class="valine_thread"><svg class="loading" style="vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2709"><path d="M832 512c0-176-144-320-320-320V128c211.2 0 384 172.8 384 384h-64zM192 512c0 176 144 320 320 320v64C300.8 896 128 723.2 128 512h64z" p-id="2710"></path></svg></div>

    </div>
  </div>



      
<footer class="page-footer fs12"><hr><div><p>本博客所有文章除特别声明外，均采用 <a target="_blank" rel="noopener" href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a> 许可协议，转载请注明出处。</p>
<p>本站由 <a href="https://stassenger.gitee.io/">@Asante Stassenger</a> 创建，使用 <a target="_blank" rel="noopener" href="https://github.com/xaoxuu/hexo-theme-stellar/tree/1.1.0">Stellar</a> 作为主题。</p>
</div></footer>


      <div class='float-panel mobile-only' style='display:none'>
  <button type='button' class='sidebar-toggle mobile' onclick='sidebar.toggle()'>
    <svg class="icon" viewBox="0 0 1228 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2849"><path d="M0 0m97.390199 0l973.901995 0q97.390199 0 97.390199 97.390199l0 0q0 97.390199-97.390199 97.3902l-973.901995 0q-97.390199 0-97.390199-97.3902l0 0q0-97.390199 97.390199-97.390199Z" p-id="2850"></path><path d="M0 389.560798m97.390199 0l973.901995 0q97.390199 0 97.390199 97.390199l0 0q0 97.390199-97.390199 97.3902l-973.901995 0q-97.390199 0-97.390199-97.3902l0 0q0-97.390199 97.390199-97.390199Z" p-id="2851"></path><path d="M0 779.121596m97.390199 0l973.901995 0q97.390199 0 97.390199 97.390199l0 0q0 97.390199-97.390199 97.390199l-973.901995 0q-97.390199 0-97.390199-97.390199l0 0q0-97.390199 97.390199-97.390199Z" p-id="2852"></path></svg>
  </button>
</div>

    </div>
  </div>
  <div class='scripts'>
    <script type="text/javascript">
  stellar = {
    // 懒加载 css https://github.com/filamentgroup/loadCSS
    loadCSS: (href, before, media, attributes) => {
      var doc = window.document;
      var ss = doc.createElement("link");
      var ref;
      if (before) {
        ref = before;
      } else {
        var refs = (doc.body || doc.getElementsByTagName("head")[0]).childNodes;
        ref = refs[refs.length - 1];
      }
      var sheets = doc.styleSheets;
      if (attributes) {
        for (var attributeName in attributes) {
          if (attributes.hasOwnProperty(attributeName)) {
            ss.setAttribute(attributeName, attributes[attributeName]);
          }
        }
      }
      ss.rel = "stylesheet";
      ss.href = href;
      ss.media = "only x";
      function ready(cb) {
        if (doc.body) {
          return cb();
        }
        setTimeout(function () {
          ready(cb);
        });
      }
      ready(function () {
        ref.parentNode.insertBefore(ss, before ? ref : ref.nextSibling);
      });
      var onloadcssdefined = function (cb) {
        var resolvedHref = ss.href;
        var i = sheets.length;
        while (i--) {
          if (sheets[i].href === resolvedHref) {
            return cb();
          }
        }
        setTimeout(function () {
          onloadcssdefined(cb);
        });
      };
      function loadCB() {
        if (ss.addEventListener) {
          ss.removeEventListener("load", loadCB);
        }
        ss.media = media || "all";
      }
      if (ss.addEventListener) {
        ss.addEventListener("load", loadCB);
      }
      ss.onloadcssdefined = onloadcssdefined;
      onloadcssdefined(loadCB);
      return ss;
    },

    // 从 butterfly 和 volantis 获得灵感
    loadScript: (src, opt) => new Promise((resolve, reject) => {
      var script = document.createElement('script')
      script.src = src
      if (opt) {
        for (let key of Object.keys(opt)) {
          script[key] = opt[key]
        }
      } else {
        // 默认异步，如果需要同步，第二个参数传入 {} 即可
        script.async = true
      }
      script.onerror = reject
      script.onload = script.onreadystatechange = function() {
        const loadState = this.readyState
        if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
        script.onload = script.onreadystatechange = null
        resolve()
      }
      document.head.appendChild(script)
    }),

    // https://github.com/jerryc127/hexo-theme-butterfly
    jQuery: (fn) => {
      if (typeof jQuery === 'undefined') {
        stellar.loadScript(stellar.plugins.jQuery).then(fn)
      } else {
        fn()
      }
    }
  };
  stellar.github = 'https://github.com/xaoxuu/hexo-theme-stellar/tree/1.1.0';
  stellar.config = {
    date_suffix: {
      just: '刚刚',
      min: '分钟前',
      hour: '小时前',
      day: '天前',
      month: '个月前',
    },
  };

  // required plugins (only load if needs)
  stellar.plugins = {
    jQuery: 'https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js',
    sitesjs: '/js/plugins/sites.js',
    friendsjs: '/js/plugins/friends.js',
  };

  // optional plugins
  if ('true' == 'true') {
    stellar.plugins.lazyload = Object.assign({"enable":true,"js":"https://cdn.jsdelivr.net/npm/vanilla-lazyload@17.3.1/dist/lazyload.min.js","transition":"blur"});
  }
  if ('true' == 'true') {
    stellar.plugins.swiper = Object.assign({"enable":true,"css":"https://unpkg.com/swiper/swiper-bundle.min.css","js":"https://unpkg.com/swiper/swiper-bundle.min.js"});
  }
  if ('' == 'true') {
    stellar.plugins.scrollreveal = Object.assign({"enable":null,"js":"https://cdn.jsdelivr.net/npm/scrollreveal@4.0.9/dist/scrollreveal.min.js","distance":"8px","duration":500,"interval":100,"scale":1});
  }
  if ('true' == 'true') {
    stellar.plugins.preload = Object.assign({"enable":true,"service":"flying_pages","instant_page":"https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@4.1.2/js/instant_page.js","flying_pages":"https://cdn.jsdelivr.net/gh/gijo-varghese/flying-pages@2.1.2/flying-pages.min.js"});
  }
</script>

<!-- required -->

  
<script src="/js/main.js" async></script>



<!-- optional -->

  <script>
  function getEmojiMaps() {
    function emoji(path, idx, ext) {
      return path + "/" + path + "-" + idx + "." + ext;
    }
    var emojiMaps = {};
    for (var i = 1; i <= 54; i++) {
      emojiMaps['tieba-' + i] = emoji('tieba', i, 'png');
    }
    for (var i = 1; i <= 101; i++) {
      emojiMaps['qq-' + i] = emoji('qq', i, 'gif');
    }
    for (var i = 1; i <= 116; i++) {
      emojiMaps['aru-' + i] = emoji('aru', i, 'gif');
    }
    for (var i = 1; i <= 125; i++) {
      emojiMaps['twemoji-' + i] = emoji('twemoji', i, 'png');
    }
    for (var i = 1; i <= 4; i++) {
      emojiMaps['weibo-' + i] = emoji('weibo', i, 'png');
    }
    return emojiMaps;
  }
  function load_comment(){
    if(!document.getElementById("valine_container"))return;
    stellar.loadScript('https://cdn.jsdelivr.net/gh/XuxuGood/simple-blog-cdn@main/js/Valine.min.js', {defer:true}).then(function () {
      const el = document.getElementById("valine_container");
      var path = el.getAttribute('comment_id');
      const placeholder = "";
      if (!path) {
        path = decodeURI(window.location.pathname);
      }
      var valine = new Valine();
      valine.init(Object.assign({"js":"https://cdn.jsdelivr.net/gh/XuxuGood/simple-blog-cdn@main/js/Valine.min.js","appId":"Gmd8dpj69RW0YYzTOgchjKDG-9Nh9j0Va","appKey":"8XTx3FrEGvL5fwadDKGc0sHf","placeholder":null,"visitor":true,"requiredFields":["nick","mail"],"enableQQ":true,"recordIP":false,"avatar":"robohash","pageSize":10,"lang":"zh-cn","highlight":true,"mathJax":false,"tagMeta":["博主","小伙伴","访客"],"metaPlaceholder":{"nick":"昵称/QQ号(必填)","mail":"邮箱（必填）"},"master":["6783037F2DF30EAB99F9FC256157D875"],"friends":["6783037F2DF30EAB99F9FC256157D875"]}, {
        el: '#valine_container',
        path: path,
        placeholder: placeholder,
        emojiCDN: 'https://cdn.jsdelivr.net/gh/volantis-x/cdn-emoji/valine/',
        emojiMaps: getEmojiMaps(),
      }));
    });
  }
  window.addEventListener('DOMContentLoaded', (event) => {
    console.log('DOM fully loaded and parsed');
    load_comment();
  });

</script>




<!-- inject -->


  </div>
</body>
</html>
